﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using plust.Persistencia;
using plust.Clases;
using FirstFloor.ModernUI.Windows.Controls;
using System.Diagnostics;
using System.ComponentModel;

namespace plust.Content
{
    /// <summary>
    /// Interaction logic for RealizarVenta.xaml
    /// </summary>
    public partial class RealizarVenta : UserControl
    {

        PersistenciaDB persistencia = new PersistenciaDB();
        Venta nuevaventa = new Venta(DateTime.Now.ToString());

        enum Estado { Espera, Eliminar, Descuento, Cantidad, Total, Final};

        Estado myEstado;
         
        public RealizarVenta()
        {
            InitializeComponent();
            this.Loaded += OnLoaded;
            myEstado = Estado.Espera;
        }

        void OnLoaded(object sender, RoutedEventArgs e)
        {
            this.reset();
        }

        private void tbCodigoBarras_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                if (persistencia.existeProductoSku(this.tbCodigoBarras.Text))
                {
                    Producto aux = persistencia.obtenerProductoSku(this.tbCodigoBarras.Text);

                    if (aux != null)
                    {
                        nuevaventa.ingresarProducto(aux);
                        this.lwListaProductos.ItemsSource = nuevaventa.generarFilaProducto();
                        this.lblMonto.Text = nuevaventa.monto_venta.ToString();
                        this.tbCodigoBarras.Text = String.Empty;
                        this.lwListaProductos.SelectedIndex = this.lwListaProductos.Items.Count - 1;
                        Keyboard.Focus(this.tbCodigoBarras);
                    }
                    else
                    {
                        new ModernDialog
                        {
                            Title = "ERROR",
                            Content = "Error Inesperado."
                        }.ShowDialog();

                        this.tbCodigoBarras.Text = String.Empty;
                        Keyboard.Focus(this.tbCodigoBarras);
                    }
                }
                else
                {
                    new ModernDialog
                    {
                        Title = "ERROR",
                        Content = "El producto no existe."
                    }.ShowDialog();

                    this.tbCodigoBarras.Text = String.Empty;
                    Keyboard.Focus(this.tbCodigoBarras);
                }
            }
        }

        private void btTotal_Click(object sender, RoutedEventArgs e)
        {
            if(this.lwListaProductos.Items.Count > 0)
            {
                this.tbCodigoBarras.IsEnabled = false;
                this.btCantidad.IsEnabled = false;
                this.btConsultar.IsEnabled = false;
                this.btEliminar.IsEnabled = false;
                this.rbBoleta.IsEnabled = false;
                this.rbFactura.IsEnabled = false;
                this.rbNinguno.IsEnabled = false;
                this.btTotal.IsEnabled = false;
                this.btDescuento.IsEnabled = true;
                this.btPagar.IsEnabled = true;

                this.tbInstruccionesUsuario.Text = "Esperando Seleccion.";
                this.lblTotal.Text = this.nuevaventa.monto_venta.ToString();

                myEstado = Estado.Total;
            }         
        }

        private void reset()
        {
            myEstado = Estado.Espera;

            this.tbCodigoBarras.IsEnabled = true;
            this.btCantidad.IsEnabled = true;
            this.btConsultar.IsEnabled = true;
            this.btEliminar.IsEnabled = true;
            this.btLimpiar.IsEnabled = true;
            this.btTotal.IsEnabled = true;
            this.rbBoleta.IsEnabled = true;
            this.rbFactura.IsEnabled = true;
            this.rbNinguno.IsEnabled = true;

            this.btDescuento.IsEnabled = false;
            this.btPagar.IsEnabled = false;

            this.lblDescuento.Text = "0";
            this.lblMonto.Text = "0";
            this.lblTotal.Text = "0";
            this.lblVuelto.Text = "0";
            this.lblPago.Text = "0";

            this.tbInputUsuario.Text = string.Empty;
            this.tbInputUsuario.IsEnabled = false;
            this.tbInstruccionesUsuario.Text = "Ingrese Codigo del producto.";

            this.btLimpiar.Content = "Limpiar";

            this.btCantidad.Content = "Cantidad";
             
            this.lwListaProductos.ItemsSource = null;

            this.lwListaProductos.IsEnabled = true;

            this.nuevaventa = new Venta(DateTime.Now.ToString());

            this.rbBoleta.IsChecked = true;

            Keyboard.Focus(this.tbCodigoBarras);
        }

        private void btLimpiar_Click(object sender, RoutedEventArgs e)
        {
            this.reset();
        }

        private void btEliminar_Click(object sender, RoutedEventArgs e)
        {
            if (this.lwListaProductos.SelectedIndex != -1)
            {
                if (myEstado == Estado.Eliminar)
                {
                    myEstado = Estado.Espera;
                    habilitar("Eliminar");   
                }
                else
                {
                    myEstado = Estado.Eliminar;     
                    desabilitar("Eliminar");
                   
                }         
            }          
        }

        private void btCantidad_Click(object sender, RoutedEventArgs e)
        {
            if (this.lwListaProductos.SelectedIndex != -1)
            {
                if (myEstado == Estado.Cantidad)
                {
                    myEstado = Estado.Espera;
                    habilitar("Cantidad");
                }
                else 
                {
                    myEstado = Estado.Cantidad;
                    desabilitar("Cantidad");
                }
            }
        }

        private void btDescuento_Click(object sender, RoutedEventArgs e)
        {
            if(myEstado == Estado.Descuento)
            {
                myEstado = Estado.Total;
                habilitar("Descuento");
            }
            else
            {
                myEstado = Estado.Descuento;
                desabilitar("Descuento");
            }        
        }

        private void habilitar(string p)
        {
            if (p == "Eliminar")
            {
                this.tbInstruccionesUsuario.Text = "Ingrese Codigo del producto.";
                this.btEliminar.Content = "Eliminar";
                this.tbInputUsuario.Text = string.Empty;
                this.tbInputUsuario.IsEnabled = false;
                this.btCantidad.IsEnabled = true;
                this.btConsultar.IsEnabled = true;
                this.btTotal.IsEnabled = true;
                this.btPagar.IsEnabled = false;
                this.rbBoleta.IsEnabled = true;
                this.rbFactura.IsEnabled = true;
                this.rbNinguno.IsEnabled = true;
                this.btDescuento.IsEnabled = false;
                this.tbCodigoBarras.IsEnabled = true;
                this.lwListaProductos.IsEnabled = true;
                
                this.tbCodigoBarras.Text = String.Empty;
                Keyboard.Focus(this.tbCodigoBarras);
            }

            else if (p == "Cantidad")
            {
                this.tbInstruccionesUsuario.Text = "Ingrese Codigo del producto.";
                this.btCantidad.Content = "Cantidad";
                this.tbInputUsuario.Text = string.Empty;
                this.tbInputUsuario.IsEnabled = false;
                this.btEliminar.IsEnabled = true;
                this.btCantidad.IsEnabled = true;
                this.btConsultar.IsEnabled = true;
                this.btTotal.IsEnabled = true;
                this.btPagar.IsEnabled = false;
                this.rbBoleta.IsEnabled = true;
                this.rbFactura.IsEnabled = true;
                this.rbNinguno.IsEnabled = true;
                this.btDescuento.IsEnabled = false;
                this.tbCodigoBarras.IsEnabled = true;
                this.lwListaProductos.IsEnabled = true;

                this.tbCodigoBarras.Text = String.Empty;
                Keyboard.Focus(this.tbCodigoBarras);
            }

            else if (p == "Descuento")
            {
                if(myEstado == Estado.Total)
                {
                    this.btPagar.IsEnabled = true;
                    this.btDescuento.Content = "Descuento";
                    this.tbInstruccionesUsuario.Text = "Ingrese cantidad a descontar.";
                }
                else if (myEstado == Estado.Final)
                {
                    this.btDescuento.Content = "Descuento";
                    this.btDescuento.IsEnabled = false;
                    this.tbInputUsuario.Text = string.Empty;
                    this.tbInstruccionesUsuario.Text = "Ingrese pago.";
                    Keyboard.Focus(tbInputUsuario);
                }           
            }
        }

        private void desabilitar(string p)
        {
            if(p == "Eliminar")
            {
                this.tbInputUsuario.IsEnabled = true;
                this.tbInstruccionesUsuario.Text = "Ingrese la cantidad a eliminar.";
                this.btEliminar.Content = "Cancelar";
                this.btCantidad.IsEnabled = false;
                this.btConsultar.IsEnabled = false;
                this.btTotal.IsEnabled = false;
                this.btPagar.IsEnabled = false;
                this.rbBoleta.IsEnabled = false;
                this.rbFactura.IsEnabled = false;
                this.rbNinguno.IsEnabled = false;
                this.btDescuento.IsEnabled = false;
                this.tbCodigoBarras.IsEnabled = false;
                this.lwListaProductos.IsEnabled = false;
                this.tbInputUsuario.IsEnabled = true;
                Keyboard.Focus(tbInputUsuario);

                this.tbInputUsuario.IsEnabled = true;
                Keyboard.Focus(tbInputUsuario);
            }
            else if (p == "Cantidad")
            {
                this.tbInstruccionesUsuario.Text = "Ingrese la cantidad total del producto.";
                this.btCantidad.Content = "Cancelar";
                this.btEliminar.IsEnabled = false;
                this.btConsultar.IsEnabled = false;
                this.btTotal.IsEnabled = false;
                this.btPagar.IsEnabled = false;
                this.rbBoleta.IsEnabled = false;
                this.rbFactura.IsEnabled = false;
                this.rbNinguno.IsEnabled = false;
                this.btDescuento.IsEnabled = false;
                this.tbCodigoBarras.IsEnabled = false;
                this.lwListaProductos.IsEnabled = false;

                this.tbInputUsuario.IsEnabled = true;
                Keyboard.Focus(tbInputUsuario);

            }
            else if (p == "Descuento")
            {
                this.btPagar.IsEnabled = false;
                this.tbInputUsuario.IsEnabled = true;
                btDescuento.Content = "Cancelar"; 
                this.tbInstruccionesUsuario.Text = "Ingrese la cantidad a descontar.";
                Keyboard.Focus(this.tbInputUsuario);
            }
        }

        private void tbInputUsuario_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.Key == Key.Return)
            {
                if (myEstado == Estado.Eliminar)
                {
                    try
                    {
                        int aux = int.Parse(this.tbInputUsuario.Text);

                        if (nuevaventa.eliminarProducto(((FilaProducto)this.lwListaProductos.SelectedItems[0]).Sku, aux))
                        {
                            this.lwListaProductos.ItemsSource = nuevaventa.generarFilaProducto();
                            this.lblMonto.Text = nuevaventa.monto_venta.ToString();
                            this.habilitar("Eliminar");
                            myEstado = Estado.Espera;
                            this.tbCodigoBarras.Text = String.Empty;
                            Keyboard.Focus(this.tbCodigoBarras);
                            this.tbInputUsuario.IsEnabled = false;
                        }
                        else
                        {
                            this.tbInstruccionesUsuario.Text = "Ingrese una cantidad menor.";
                        }

                    }
                    catch (System.FormatException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad valida.";
                    }

                }else if( myEstado == Estado.Cantidad){

                    try
                    {
                        int aux = int.Parse(this.tbInputUsuario.Text);
                        Producto p = this.persistencia.obtenerProductoSku(((FilaProducto)this.lwListaProductos.SelectedItems[0]).Sku);

                        if (aux > 0)
                        {
                            if (this.nuevaventa.ingresarProductoCantidad(p, aux))
                            {
                                this.lwListaProductos.ItemsSource = nuevaventa.generarFilaProducto();
                                this.lblMonto.Text = nuevaventa.monto_venta.ToString();
                                myEstado = Estado.Espera;
                                this.habilitar("Cantidad");   
                            }
                            else
                            {
                                this.tbInstruccionesUsuario.Text = "Ingrese una cantidad mayor.";
                            }                       
                        }
                        else
                        {
                            this.tbInstruccionesUsuario.Text = "Ingrese una cantidad mayor que 0.";
                    
                        }
                    }
                    catch (System.FormatException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad valida.";
                    }
                    catch (OverflowException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad menor.";
                    }
                }
                else if (myEstado == Estado.Descuento)
                {
                    try
                    {
                        int aux = int.Parse(this.tbInputUsuario.Text);
                        int desc = this.nuevaventa.descuentoTotal(aux);

                        if( desc != -1)
                        {
                            this.lwListaProductos.ItemsSource = nuevaventa.generarFilaProducto();
                            this.lblDescuento.Text = aux.ToString();
                            this.lblTotal.Text = nuevaventa.monto_venta.ToString();
                            myEstado = Estado.Final;
                            this.habilitar("Descuento");
                            
                        }
                        else
                        {
                            this.tbInstruccionesUsuario.Text = "Ingrese una cantidad menor que subtotal.";
                        }

                    }
                    catch (System.FormatException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad válida.";
                    }
                    catch (OverflowException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad menor.";
                    } 
                }else if(myEstado == Estado.Final){
                    try
                    {
                        int aux = int.Parse(this.tbInputUsuario.Text);
                        int vuelto = this.nuevaventa.calcularVuelto(aux);

                        if(vuelto != -1)
                        {
                            if (this.rbBoleta.IsChecked == true)
                            {
                                this.nuevaventa.tipo_venta = 1;
                            }
                            else if(this.rbFactura.IsChecked == true)
                            {
                                this.nuevaventa.tipo_venta = 2;

                                if (!pagarFactura(nuevaventa))
                                {
                                    new ModernDialog
                                    {
                                        Title = "Advertencia",
                                        Content = "No se ha facturado.",
                                        Foreground = Brushes.Blue,
                                        FontWeight = FontWeights.SemiBold,
                                    }.ShowDialog();

                                    this.reset();
                                    return;
                                }
                            }
                            else if(this.rbNinguno.IsChecked == true)
                            {
                                this.nuevaventa.tipo_venta = 0;
                            }

                            this.lblPago.Text = aux.ToString();
                            this.lblVuelto.Text = vuelto.ToString();
                            this.tbInstruccionesUsuario.Text = "Venta Finalizada.";
                            this.tbInputUsuario.Text = string.Empty;
                            this.btLimpiar.IsEnabled = true;
                          
                            //insertar venta en bd
                            this.persistencia.ingresarNuevaVenta(nuevaventa);

                            //Vincular factura con venta
                            this.persistencia.vincularVenta();


                            //rebajar stock en bd       
                            this.persistencia.rebajarStockVenta(nuevaventa);

                            this.btLimpiar.Content = "Nueva Venta";
                            Keyboard.Focus(this.btLimpiar);
                        }
                        else
                        {
                            this.tbInstruccionesUsuario.Text = "Ingrese un pago mayor.";
                        }
                    }
                    catch (System.FormatException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad valida.";
                    }
                    catch (OverflowException ex)
                    {
                        this.tbInstruccionesUsuario.Text = "Ingrese una cantidad menor.";
                    }
                }
            }
        }

        private bool pagarFactura(Venta nuevaventa)
        {
            NuevaFacturaDialog nfd = new NuevaFacturaDialog(nuevaventa);
            
            new ModernWindow
            {
                Style = (Style)App.Current.Resources["EmptyWindow"],
                Content = nfd,
                Width = 1000,
                Height = 600,
                Margin = new Thickness(42),
                Padding = new Thickness(42),
                WindowStartupLocation = WindowStartupLocation.CenterScreen,
                ResizeMode = ResizeMode.NoResize
            }.ShowDialog();

            if (nfd.facturado)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void btPagar_Click(object sender, RoutedEventArgs e)
        {
            this.btPagar.IsEnabled = false;
            this.btDescuento.IsEnabled = false;
            this.tbInputUsuario.IsEnabled = true;
            this.tbInstruccionesUsuario.Text = "Ingrese pago.";
            this.tbInputUsuario.Text = string.Empty;
            Keyboard.Focus(this.tbInputUsuario);
            myEstado = Estado.Final;
        }       
    }
}
